package top.z.template.parse.ast.expression;

import top.z.template.Context;
import top.z.template.Error;
import top.z.template.Template;
import top.z.template.parse.Ast;
import top.z.template.parse.Span;

import java.io.OutputStream;

/**
 * 表示通过名称访问顶层变量.
 * 例如, 在表达式 "a + 1" 中, a 会被编码为一个可访问变量节点.
 * 变量既可以被读取(在表达式中)也可以被写入(在赋值中).
 * 变量的值可以在 {@link Context} 中查找和写入.
 */
public class Variable extends Ast.Expression {

    public Variable(Span name) {
        super(name);
    }

    public Span getVariableName() {
        return getSpan();
    }

    @Override
    public Object evaluate(Template template, Context context, OutputStream out) {
        Object value = context.get(getSpan().getText());
        if (value == null) {
            throw Error.error("Couldn't find variable '" + getSpan().getText() + "' in context.", getSpan());
        }
        return value;
    }

}
